package com.yami.shop.personnft.common.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yami.shop.bean.model.NftTransferRecord;
import com.yami.shop.personnft.common.dao.NftTransferRecordMapper;
import com.yami.shop.personnft.common.model.PersonNft;
import com.yami.shop.personnft.common.service.NftTransferRecordService;
import com.yami.shop.personnft.common.service.PersonNftService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

@Slf4j
@Service
public class NftTransferRecordServiceImpl extends ServiceImpl<NftTransferRecordMapper, NftTransferRecord> implements NftTransferRecordService {

//    @Autowired
//    private NftService nftService;
    @Autowired
    private PersonNftService personNftService;

    @Override
    public void doTransfer() {
//
//        List<NftTransferRecord> list = list(new LambdaQueryWrapper<NftTransferRecord>().eq(NftTransferRecord::getStatus, 0)
//                .lt(NftTransferRecord::getNum, 6)
//                .orderByAsc(NftTransferRecord::getCreateTime).last("limit 0,20"));
//
//        if (CollUtil.isEmpty(list)) {
//            log.info("没有待划转的资产转移。");
//            return;
//        }
//
//        List<Long> ids = list.stream().map(NftTransferRecord::getId).collect(Collectors.toList());
//        update(new LambdaUpdateWrapper<NftTransferRecord>().set(NftTransferRecord::getStatus, 1)
//                .set(NftTransferRecord::getUpdateTime, new Date())
//                .in(NftTransferRecord::getId, ids));
//        log.info("---"+ ids.size() + "个进入划转中---");
//
//        Map<String, List<NftTransferRecord>> map = list.stream().collect(Collectors.groupingBy(NftTransferRecord::getMnemonic));
//
//        for ( List<NftTransferRecord> records : map.values()) {
//            String errorMsg = null;
//            ResultTx resultTx = null;
//            try {
//                resultTx = nftService.transferNFtMsg(records);
//            } catch (Exception e) {
//                log.error("资产转移接口报错"+e.getMessage());
//                errorMsg = getString(e);
//            } finally {
//                String dawHash = "";
//                if(resultTx!= null && resultTx.getResult()!= null && StringUtils.isNotEmpty(resultTx.getResult().getHash())){
//                    dawHash = resultTx.getResult().getHash();
//                }
//                List<PersonNft> personNftVOs = new ArrayList<>();
//                if(resultTx != null && resultTx.getCode() == 0){
//                    //更新持仓状态
//                    for (NftTransferRecord record : records) {
//                        record.setStatus(2);
//                        record.setNum(record.getNum() + 1);
//                        record.setUpdateTime(new Date());
//                        PersonNft personNftVO = new PersonNft();
//                        personNftVO.setUserId(record.getUserId());
//                        personNftVO.setTokenId(record.getNftId());
//                        personNftVO.setRemark("0");
//                        personNftVO.setDawHash(dawHash);
//                        personNftVO.setStatus(getStatusByType(record.getType()));
//                        personNftVOs.add(personNftVO);
//                        log.info("nft资产转移成功... message: userid:{}, tokenid:{}", record.getUserId(), record.getNftId());
//                    }
//                }else {
//                    for (NftTransferRecord record : records) {
//                        record.setStatus(3);
//                        record.setNum(record.getNum() + 1);
//                        record.setUpdateTime(new Date());
//                        record.setErrorMsg(errorMsg);
//                        log.info("nft资产转移失败... message:userid:{},tokenid:{}", record.getUserId(), record.getNftId());
//                        PersonNft personNftVO = new PersonNft();
//                        personNftVO.setUserId(record.getUserId());
//                        personNftVO.setTokenId(record.getNftId());
//                        personNftVO.setRemark("1");
//                        personNftVO.setDawHash(dawHash);
//                        personNftVOs.add(personNftVO);
//                    }
//                }
//                personNftService.updateByTokenIds(personNftVOs);
//                updateBatchById(records);
//            }
//
//        }

    }

    @Override
    public void checkTransferFail() {
//        List<NftTransferRecord> list = list(new LambdaQueryWrapper<NftTransferRecord>().eq(NftTransferRecord::getStatus, 3)
//                .lt(NftTransferRecord::getNum, 6));
//
//        if (CollUtil.isEmpty(list)) {
//            log.info("没有失败的资金转移。");
//            return;
//        }
//        List<PersonNft> personNftVOs = new ArrayList<>();
//        list.stream().forEach(record -> {
//            QueryNFTResp queryNFTResp = nftService.queryNFT(record.getDenomId(), record.getNftId(), record.getMnemonic());
//            if(queryNFTResp.getOwner().equals(record.getReci())){
//                record.setStatus(2);
//                //属于就更新状态
//                PersonNft personNftVO = new PersonNft();
//                personNftVO.setUserId(record.getUserId());
//                personNftVO.setTokenId(record.getNftId());
//                personNftVO.setRemark("0");
//                personNftVO.setStatus(getStatusByType(record.getType()));
//                personNftVOs.add(personNftVO);
//            } else {
//                record.setStatus(0);
//            }
//        });
//        if(personNftVOs.size()>0){
//            personNftService.updateByTokenIds(personNftVOs);
//        }
//        updateBatchById(list);
    }


    @Override
    public void aloneTransferFail() {
//        List<NftTransferRecord> list = list(new LambdaQueryWrapper<NftTransferRecord>()
//                .eq(NftTransferRecord::getStatus, 3)
//                .ge(NftTransferRecord::getNum, 6)
//                .lt(NftTransferRecord::getNum, 8)
//                .last("limit 0,700"));
//
//        if (CollUtil.isEmpty(list)) {
//            log.info("没有失败的批量转移。");
//            return;
//        }
//
//        List<Long> ids = list.stream().map(NftTransferRecord::getId).collect(Collectors.toList());
//
//        update(new LambdaUpdateWrapper<NftTransferRecord>().set(NftTransferRecord::getStatus, 1)
//                .set(NftTransferRecord::getUpdateTime, new Date())
//                .in(NftTransferRecord::getId, ids));
//
//        log.info("---"+ ids.size() + "个资产转移失败的进入 单独划转中---");
//        List<PersonNft> personNftVOs = new ArrayList<>();
//        for (NftTransferRecord record : list) {
//            String errorMsg = null;
//            ResultTx resultTx = null;
//            try {
//                resultTx = nftService.transferNFt(record.getDenomId(), record.getNftId(), record.getReci(), record.getMnemonic(), 1);
//            } catch (Exception e) {
//                log.error("资产转移接口报错"+e.getMessage());
//                errorMsg = getString(e);
//            } finally {
//                String dawHash = "";
//                if(resultTx!= null && resultTx.getResult()!= null && StringUtils.isNotEmpty(resultTx.getResult().getHash())){
//                    dawHash = resultTx.getResult().getHash();
//                }
//                if(resultTx != null && resultTx.getCode() == 0){
//                    //更新持仓状态
//                    record.setStatus(2);
//                    record.setNum(record.getNum() + 1);
//                    record.setUpdateTime(new Date());
//                    PersonNft personNftVO = new PersonNft();
//                    personNftVO.setUserId(record.getUserId());
//                    personNftVO.setTokenId(record.getNftId());
//                    personNftVO.setRemark("0");
//                    personNftVO.setDawHash(dawHash);
//                    personNftVO.setStatus(getStatusByType(record.getType()));
//                    personNftVOs.add(personNftVO);
//                    log.info("nft资产转移完成... message: userid:{}, tokenid:{}", record.getUserId(), record.getNftId());
//                }else {
//                    record.setStatus(3);
//                    record.setNum(record.getNum() + 1);
//                    record.setUpdateTime(new Date());
//                    record.setErrorMsg(errorMsg);
//                    log.info("nft资产转移失败... message:userid:{},tokenid:{}", record.getUserId(), record.getNftId());
//                    PersonNft personNftVO = new PersonNft();
//                    personNftVO.setUserId(record.getUserId());
//                    personNftVO.setTokenId(record.getNftId());
//                    personNftVO.setRemark("1");
//                    personNftVO.setDawHash(dawHash);
//                    personNftVOs.add(personNftVO);
//                }
//                updateById(record);
//            }
//        }
//        personNftService.updateByTokenIds(personNftVOs);
    }


    /**
     * 根据类型资产转移完成后处理状态
     * @return
     */
    Integer getStatusByType(Integer type){
        //1转入 2转出 3转赠 4用户购买 5兑换删除 6 合成删除
        Integer status = null;
        switch (type){
            case 1:status = 0;break;
            //case 2:status = 5;break; 转出先不处理状态，资产确认到恒生后再删除
            case 3:status = 0;break;
            case 4:status = 0;break;
            case 5:status = 2;break;
            case 6:status = 2;break;
        }
        return status;
    }

    private String getString(Exception e) {
        String msg = "";
        if(StringUtils.isEmpty(e.getMessage())&& Arrays.toString(e.getStackTrace()).length()<=490){
            msg = "null--"+ Arrays.toString(e.getStackTrace()).substring(0);
        }else if(StringUtils.isEmpty(e.getMessage())&&Arrays.toString(e.getStackTrace()).length()>490){
            msg = "null--"+ Arrays.toString(e.getStackTrace()).substring(0,490);
        }else if(e.getMessage().length()>500){
            msg = e.getMessage().substring(0,500);
        }else{
            msg = e.getMessage().substring(0);
        }
        return msg;
    }
}
